/*
 * @Author: rafa
 * @Date: 2020-07-08 16:12:32
 * @LastEditors: rafa
 * @LastEditTime: 2020-07-08 16:15:18
 * @Description: 文件说明
 * @FilePath: \src\utils\index.js
 */

/**
 * @method  getUrlParam
 * @desc  获取url参数
 * @param {string} name,  需要获取的参数名
 * @param {boolean} isHash, url是否为hash模式，默认false
 * @return {string} 返回获取到的参数值，没找到返回null
 * @author  rafa.li
 * @date 2020/12/24
 */
export const getUrlParam = (name, isHash=false) => {
  let url = window.location.search
  if (isHash) {
    url = window.location.hash
    url = url.replace(/^#.*?\?/, '?')
  }
  let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");

  let r = url.substr(1).match(reg);
  if (r != null) return unescape(r[2]);
  return null;
};


/**
 * @method  typeOf
 * @desc  数据类型判断
 * @param obj, 需要判断的数据
 * @return {string} 返回数据类型字符串
 * @author  rafa.li
 * @date 2022/7/13
 */
export const typeOf = (obj) => {
  return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}

/**
 * @method  unique
 * @desc  数组去重ES6实现
 * @param arr, 需要去重的数组
 * @return {array} 返回去重后的数组
 * @author  rafa.li
 * @date 2022/7/13
 */
export const unique = (arr) => [...new Set(arr)]


/**
 * @method  unique1
 * @desc  数组去重ES5实现
 * @param arr, 需要去重的数组
 * @return {array} 返回去重后的数组
 * @author  rafa.li
 * @date 2022/7/13
 */
export const unique1 = (arr) => {
  let res = arr.filter(function (item, index, array) {
    return array.indexOf(item) === index
  })
  return res
}

/**
 * @method  flatten
 * @desc  数组扁平化ES6实现
 * @param arr, 需要扁平化的数组
 * @return {array} 返回扁平化之后的数组
 * @author  rafa.li
 * @date 2022/7/13
 */
export const flatten = (arr) => {
  while (arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr);
  }
  return arr;
}

/**
 * @method  flatten1
 * @desc  数组扁平化ES5实现
 * @param arr, 需要扁平化的数组
 * @return {array} 返回扁平化之后的数组
 * @author  rafa.li
 * @date 2022/7/13
 */
export const flatten1 = (arr) => {
  let result = []
  for (let i=0, len = arr.length; i<len; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(flatten1(arr[i]))
    } else {
      result.push(arr[i])
    }
    return result
  }
}



/**
 * @method  deepClone
 * @desc  深拷贝
 * @param target, 需要拷贝的数据
 * @return {array} 返回扁平化之后的数组
 * @author  rafa.li
 * @date 2022/7/13
 */
function deepClone(target, map = new WeakMap()) {
  if (map.get(target)) {
    return target;
  }
  // 获取当前值的构造函数：获取它的类型
  let constructor = target.constructor;
  // 检测当前对象target是否与正则、日期格式对象匹配
  if (/^(RegExp|Date)$/i.test(constructor.name)) {
    // 创建一个新的特殊对象(正则类/日期类)的实例
    return new constructor(target);
  }
  if ((typeof target === "object" || typeof target === "function") && target !== null) {
    map.set(target, true);  // 为循环引用的对象做标记
    const cloneTarget = Array.isArray(target) ? [] : {};
    for (let prop in target) {
      if (target.hasOwnProperty(prop)) {
        cloneTarget[prop] = deepClone(target[prop], map);
      }
    }
    return cloneTarget;
  } else {
    return target;
  }
}

